|
Date :................................ 20 septembre
1992 Programme : ......................SEVEN COLORS Protection : ..........................MOT DE PASSE Outils : ................................SOFT-ICE V2.50 Temps passé : ...........................15 MINUTES Fichier : ...................................TATOU.COM Société : ..............................INFOGRAMME Divers :...Compacté par un compacteur maison. Origine :................................................... B.Y. Numéro : ..................................................184 |
Ayant recraché le hard j'ai perdu ce DEP en même temps que celui de SUPERTETRIS ( recracké depuis ). J'ai retrouvé ce DEP par l'intermédiaire d'un de mes coress ( notemment Mr B.Y ) je l'ai donc "raccroché" à la fin de ce fichier. Ce produit comme tous les TATOU est crypté sans utiliser LZ91 ou PKLITE. Ceci signifie qu'une seule solution ( la plus rapide ) est à employer: le détournement de l'int 1C ou l'int hard du clavier ( 9 ). Voici donc rapidement comment y arriver: A l'endroit de la demande du code, la touche ESPACE permet d'arriver à CS:B208 et de continuer. CS=1027 CS:B206 7403 JZ B20B ; Si barre d'espace on continue par CS:B208 E90300 JMP B20E ; B20E sinon on revient par B0B8. CS:B20B E9AAFE JMP B0B8 CS:B20E ...... suite On arrive plus loin à quelque chose qui frappe l'oeil: On place 0 dans AX dans un cas et 1 dans un autre. En faisant un essai on s'aperçoit que la bonne réponse passe par B27A qui mettra 0000 dans AX puis des POPs et REFT. Il suffit donc d'annuler le test en B278 par une inversion, un autre saut direct, ou plus simplement des NOPs. CS:B278 7503 JNZ B27D ; Saut à annuler par des 9090. CS:B27A E91E00 JMP B29B ; C'est ici qu'il faut aller si OK. CS:B27D ...... Mauvaise réponse. : : CS:B295 B80100 MOV AX,0001 CS:B298 E90600 JMP B2A1 CS:B29B B80000 MOV AX,0000 CS:B29E E90000 JMP B2A1 CS:B2A1 5F POP DI : : CS: RETF Ci-dessous le lançeur TATOU.COM qui remnplace 7503 par 9090 en CS:B278.
; PATCH POUR LE PROGRAMME SEVEN COLORS DE INFOGRAMME ; DETOURNEMENT DE L'INT 1C ; ;****************************************************************************** ; ZONE A INITIALISER adr_ip1 equ 0b278h ; adresse dont le contenu est à modifier. anc_val equ 0375h ; Valeur d'origine à rechercher, inversée. nouv_val equ 9090h ; Nouvelle valeur,inversée. INT_DET equ 1Ch ; Le numéro de l'INT que l'on veut utiliser. BEEP_TONE equ 440 ; Fréquence de la note. ;****************************************************************************** seg_a segment byte public assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a org 100h sto proc far start: jmp init ; réduire la mémoire et déplacer la db 90h ; pile plus près. paramet dw 0 ; Même bloc d'environnement. ENVIR dw 0 ; Les paramètres de la ligne de data_3 dw 0 ; commande sont recopiés ici puis FCB_1 dw 0 ; transmis au programme fils. ( 80h ) data_5 dw 0 FCB_2 dw 0 data_7 dw 0 sauve_SP dw 0 sauve_SS dw 0 data_9 dw 0, 0 drap equ 0 ;------------------------------ PROGRAMME PERE ------------------------------ loc_1: mov sauve_SP,sp mov sauve_SS,ss mov ax,80h mov ENVIR,ax ; Ligne de commande... mov data_3,ds mov ax,5Ch ; Premier FCB ( inutilisé ) mov FCB_1,ax mov data_5,ds mov ax,6Ch ; Second FCB ( inutilisé ) mov FCB_2,ax mov data_7,ds mov ah,35h mov al,INT_DET int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov cs:data_9,bx mov word ptr cs:data_9+2,es mov ah,25h mov al,INT_DET lea dx,cs:[_int] ; Load effective addr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx lea dx,cs:[nom_prg] ; Load effective addr push ds pop es lea bx,cs:[paramet] ; Load effective addr mov al,0 mov ah,4Bh int 21h ; Appel du programme fils. ; run progm @ds:dx, parm @es:bx mov sp,sauve_SP mov ss,sauve_SS cmp al,2 ; teste le code de retour du programme jnz ok ; fils, 02 si pas trouvé. mov dx,offset mess_err mov ah,9 int 21h ; Les cinq instructions suivantes sont facultatives puisque le ; vecteur d'origine est remis en place dès que le patch est effectué. ; Le seul but est d'éviter le plantage du PC dans l'hypothèse o l'on ; lance le programme père et que celui-ci ne trouve pas le programme ; fils. A ce moment là on remet tout en place et on quitte. ok: mov ah,25h mov al,INT_DET mov dx,cs:data_9 mov ds,word ptr cs:data_9+2 int 21h mov ah,4Ch int 21h ; terminate with al=return code sto endp ;---------------------------- int détournée -------------------------------- int_entry proc far _int: jmp apres _SAUVE_SP dw 0,0 apres: push ax push ds push bx push cx push dx pushf ; Push flags mov dx,305h in al,dx mov word ptr cs:[_SAUVE_SP],sp mov cx,30 prochain: pop ds dec cx jz s cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche. jnz prochain mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch. xor bx,bx mov ds,bx ; L'INT 21 n'est pas réentrante, on ne peut donc pas se servir de ; la fonction 25h ( set int. vector ) mov bx,word ptr cs:data_9 ; Je remets manuellement mov ds:[INT_DET*4],bx ; en place le vecteur mov bx,word ptr cs:data_9+2 ; de l'INT détournée. mov ds:[INT_DET*4+2],bx mov dx,304h in al,dx ;* Sound - Sounds speaker with the following tone and duration: mov al, 0B6h ; Initialize channel 2 of out 43h, al ; timer chip mov dx, 12h ; Divide 1,193,180 hertz mov ax, 34DCh ; (clock frequency) by mov bx, BEEP_TONE ; desired frequency div bx ; Result is timer clock count out 42h, al ; Low byte of count to timer mov al, ah out 42h, al ; High byte of count to timer mov bx,3 ; Charge BX avec 3 BEEPs main_b: in al, 61h ; Read value from port 61h or al, 3 ; Set first two bits out 61h, al ; Turn speaker on mov dx,3 rebou: mov cx, 0ffffh bou: loopnz bou dec dx jnz rebou in al, 61h ; When time elapses, get port value xor al, 3 ; Kill bits 0-1 to turn out 61h, al ; speaker off dec cx bou1: loopnz bou1 dec bx ; Compteur de boucle. jnz main_b ; Trois bips... s: mov sp,word ptr cs:[_SAUVE_SP] popf pop dx pop cx pop bx pop ds pop ax jmp dword ptr cs:data_9 int_entry endp ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------ init: ; Décodage du texte. cld ; Pour incrémenter SI et DI. xor ax,ax mov si,offset chaine ; pointe sur le début de la chaine. mov di,si ; DI également. mov cx,offset chaine_fin - offset chaine ; 28 lignes de 6 caractères sont XORés. ; + mess_err ( 30 ) + nom_prog ( 13 ). toto: lodsb ; On cherche... xor al,ah ; On XOR. stosb ; On remet. xchg ah,al loop toto ; Et on tourne tant que CX # 0. mov ax,1a00h ; Test si carte + moniteur VGA int 10h cmp al,1ah je graf ; Si oui on affiche la fenêtre FREDDY_SOFT. suite1: mov ah,4ah mov bx,offset fin ; Fin du programme en BX. mov cl,4 ; Divisé par 4 pour avoir des paragraphes. shr bx,cl inc bx ; On en rajoute un par sécurité. int 21h ; Execution de la fonction 4Ah. mov sp,offset fin ; on déplace la pile en "fin" car elle est jmp loc_1 ; placée en FFFE dans un programme COM. graf: xor ah,ah ; Raz de l'écran mov al,3 int 10h mov ax,1301h ; Mode 01 attribut couleur dans BL. mov bx,004bh ; Page 0. mov cx,28 ; nombre de char. mov dx,0a19h ; ligne,colonne. lea bp,cs:[chaine] ligne_suiv: int 10h inc dh add bp,28 cmp dh,10h ; 6 lignes de 28 caractères. jb ligne_suiv mov ah,2 ; Pour faire disparaitre le curseur. xor bh,bh ; Page ecran 0. mov dh,25 int 10h xor ah,ah int 16h ; Attends un char... jmp suite1 db 55h,0aah ; Identificateur de début. chaine: db 'ÚÄÄÄÄÄÄÄFREDDY_SOFT!ÄÄÄÄÄÄÄ¿' db '³ ³' db '³ SEVEN COLORS Bypass ³' db "³ I hope you'll enjoy it ³" db '³ ³' db 'ÀÄÄ Lançeur Crypté V1.1 ÄÄÄÙ' mess_err db 0ah,0dh,'Programme enfant non trouvé','$' nom_prg db 'tatou.com',0,0,0,0 ; 12 car max + nul chaine_fin: db 0aah,55h ; Identificateur de fin. fin_init label near ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------ dw 100 dup (' ') fin equ this byte ; ici le sommet de la pile, SP. seg_a ends end start Date : 13 juillet 1992 Protection : MOT DE PASSE Programme : 7COLORS Outils : SOFT-ICE V2.50 Fichier : Probablement COLORS.CC1 Temps passé : 20 MINUTES Société : INFOGRAMES Divers : Chaine crypté, utilisation d'un lançeur Numéro : 183 O l'on tombe en moins de deux minutes sur le saut fatidique, mais ce dernier est crypté comme tous les fichiers d'INFOGRAMES. On trouve bien trois octets correspondant à la chaine seize fois de suite dans le fichier COLORS.CC1 mais il est plus rapide d'adapter l'un de mes lanceurs que de faire un patch seize fois de suite. De plus les octets en amont et en aval ne "collent" pas. Il est vrai que dans le fichier codé d'ETERNAM celà a fonctionné alors que la méthode du lançeur ne fonctionne pas du tout. ( salade faite avec SS:SP ) Dans le cas présent on quitte simplement la routine de demande du mot de passe par un RETF pour se retrouver dans le bon segment IP. On pourrait essayer la méthode suivante : - SAUVEGARDER le fichier COLORS.CC1. B: - Chercher avec PCTOOLS la récurrence N de ( 7503E9 ). - Patcher avec 9090. - Sauver. - Essayer le jeu. - Si OK ---> FIN - Sinon recopier le fichier original sur le fichier modifié. - Incrémenter N - Si N = 16 ---> FIN - Sinon GOTO B FIN: - Et il n'est pas évident que celà fonctionne ! CS=19F0 CS:B272 25FF00 AND AX,00FF CS:B275 3946D4 CMP [BP-2C],AX CS:B278 7503 JNZ B27D ; A NOPER ( 9090 ) CS:B27A E91E00 JMP B29B CS:B27D B80600 MOV AX,0006 Il est nécessaire de tester dans le lanceur le mot situé en B27A sous peine de déclencher le patch bien plus tot que prévu. ; PATCH POUR LE PROGRAMME 7COLORS ; DETOURNEMENT DE L'INT 1C ; ;***************************************************************************** ; ZONE A INITIALISER adr_ip1 equ 0b278h ; adresse dont le contenu est à modifier. ; Cette valeur est "directe" anc_val equ 0375h ; Valeur d'origine à rechercher. ; Celle-ci doit être inversée ( HB avec LB ) anc_val_plus2 equ 1ee9h ; Mot suivant. ( inversé ) nouv_val equ 9090h ; Nouvelle valeur. ; Celle-ci doit être inversée ( HB avec LB ) INT_DET equ 1Ch ; Le numéro de l'INT que l'on veut utiliser. BEEP_TONE EQU 440 ; Beep tone in hertz BEEP_DURATION EQU 0ffffh ;CARTE_OUT_AL equ 1 ; Si 1 on assemble avec le test en IO 300h ;***************************************************************************** seg_a segment byte public assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a . . commun à tous mes lançeurs... . . org 100h sto endp ;---------------------------- int détournée -------------------------------- int_entry proc far _int: jmp _sp ; On contourne... _SAUVE_SP dw 0,0 ; SP est sauvé dans l'int dét. _sp: push ax push ds push bx push cx push dx pushf ; Push flags ifdef CARTE_OUT_AL mov dx,300h xor al,al out dx,al ; Allume les 8 leds. else mov dx,301h ; Test pour la carte PANO_AT out dx,al ; RAZ du LS393. endif mov word ptr cs:[_SAUVE_SP],sp mov cx,25 prochain: pop ds dec cx ifdef CARTE_OUT_AL else mov dx,300h out dx,al ; Compte le nombre de dépilage ; de SP. endif jz s cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche. jnz prochain cmp word ptr ds:[adr_ip1+2],anc_val_plus2 jnz prochain mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch. xor bx,bx mov ds,bx ; L'INT 21 n'est pas réentrante, on ne peut donc pas se servir de ; la fonction 25h ( set int. vector ) mov bx,word ptr cs:data_9 ; Je remets manuellement mov ds:[INT_DET*4],bx ; en place le vecteur mov bx,word ptr cs:data_9+2 ; de l'INT détournée. mov ds:[INT_DET*4+2],bx ifdef CARTE_OUT_AL mov dx,300h mov al,0ffh ; Carte OUT_AL out dx,al ; Etteint les 8 leds. endif ;* Sound - Sounds speaker with the following tone and duration: . . . routine sonore commune... . . . s: mov sp,word ptr cs:[_SAUVE_SP] popf pop dx pop cx pop bx pop ds pop ax jmp dword ptr cs:data_9 int_entry endp ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------ . . . . . mess_err db 0ah,0dh,'Placez-moi dans le bon répertoire SVP...','$' nom_prg db 'tatou.com',0,0,0,0 ; 12 car max + nul chaine_fin: db 0aah,55h ; Identificateur de fin. fin_init label near ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------ dw 100 dup (' ') fin equ this byte ; ici le sommet de la pile, SP. seg_a ends end start FREDDY